// 使用koa
const koa = require('koa')
// koa-websocket是koa封装好的websocket功能
const websocket = require('koa-websocket')
// 实例化一个ws服务
const app = websocket(new koa())
const json = require('koa-json')
const onerror = require('koa-onerror')
const logger = require('koa-logger')
const views = require('koa-views')

// error handler
onerror(app)

const websocket_router = require('./routes/websocket')
const chat_router = require('./routes/chat')

app.use(json())
app.ws.use(json())
app.use(logger())

app.use(views(__dirname + '/views', {
  extension: 'ejs'
}))
// 引入中间件 统一消息返回处理
const routerResponse =  require('./middleware/routerResponse')
app.use(routerResponse()) //使用

// logger
app.use(async (ctx, next) => {
  const start = new Date()
  await next()
  const ms = new Date() - start
  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// koa-bodyparser 替换为 koa-body
const koaBody = require('koa-body')
app.use(koaBody({
    multipart: true,
    formidable: {
      keepExtensions: true,
      maxFileSize: 200 * 1024 * 1024    // 设置上传文件大小最大限制，默认200M
    }
}))

// 跨域
const cors = require('koa2-cors')
app.use(
  cors({
    origin: function(ctx) { //设置允许来自指定域名请求
        // if (ctx.url === '/test') {
        //     return '*'; // 允许来自所有域名请求
        // }
        // return 'http://localhost:8080'; //只允许http://localhost:8080这个域名的请求
        return ctx.header.origin
    },
    maxAge: 5, //指定本次预检请求的有效期，单位为秒。
    credentials: true, //是否允许发送Cookie
    allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], //设置所允许的HTTP请求方法
    // allowHeaders: ['Content-Type', 'Authorization', 'Accept'], //设置服务器支持的所有头信息字段
    // exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'] //设置获取其他自定义字段
  })
)

// 使用路由
app.ws.use(websocket_router.routes()).use(websocket_router.allowedMethods())
app.use(chat_router.routes(), chat_router.allowedMethods())

// error-handling
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
})

//端口号后面可采用动态的
app.listen(3003, () =>
  console.log('websocket服务启动成功')
)
